// 教程来自 https://juejin.im/post/5e707417e51d45272054d5d3

/**
 * @description 规范 私有变量和方法前要加_(下划线)区分私有和公有
 *
 * @class Cat
 */
class Cat {
    // https://blog.csdn.net/RUCwang/article/details/83002819
    constructor(catModel) {
        let { name, color, master } = catModel;
        // 私有属性和方法只能在constructor中使用
        // 私有属性
        var _heart = "❤";
        // 私有方法 
        var _heartbeat = function () {
            console.log(_heart + "跳");
        }
        // public属性
        this.name = name;
        this.color = color;
        this.master = master;
        // 只能在constructor中调用私有属性和方法
        this.jump = function () {
            _heartbeat()
            console.log("跳起来了");
        }
    }
    // pubilc方法
    description() {
        console.log("我的名字是" + this.name);
        console.log("我的颜色是" + this.color);
        console.log("我的主人是" + this.master);
    }
    // 静态方法 可以不用实例化对象,直接调用
    static descript = "静态产出一只猫";
    static actingCute() {
        console.log("猫很可爱")
    }
}
// 创建一个猫的model,不在model中做任何操作,model只是接受并组合数据(model在js中意义不大,因为没有数据类型的概念)
class CatModel {
    constructor({ color = "默认颜色", name = "默认名字", master = "还没有主人" } = {}) {
        this.color = color; // 颜色
        this.name = name; // 名字
        this.master = master; //主人
    }

}
let huahuaDetail = new CatModel({ name: "花花", color: "白色" });
let huahua = new Cat(huahuaDetail);
// public方法使用
huahua.description();
huahua.jump();
// 调用私有 输出undefined
console.log(huahua._heart);
// 静态方法调用
console.log(Cat.descript);
Cat.actingCute();


// get/set使用
class Dog {
    _name = "默认名字";
    _color = "默认颜色";
    _master = "没有主人";
    get name() {
        return this._name;
    }
    set name(value) {
        this._name = value;
    }
}

let wangwang = new Dog();
wangwang.name = "旺旺";
console.log("这条狗的名字是" + wangwang.name);